import { HuaweiTime, HuaweiTimestamp } from "./time";

export interface IDevInfo {
  /**
   * 设备类型
   */
  devType: string;
  /**
   * 固件版本（Firmware Version）
   */
  fwv: string;
  /**
   * HiLink协议版本
   */
  hiv: string;
  /**
   * 硬件版本（Hardware Version）
   */
  hwv: string;
  /**
   * MAC地址，格式为“XX:XX:XX:XX:XX:XX”，统一为大写
   */
  mac: string;
  /**
   * 制造商ID
   */
  manu: string;
  /**
   * 设备型号
   */
  model: string;
  /**
   * 产品ID
   */
  prodId: string;
  /**
   * 协议类型。取值范围如下：
  1: Wi-Fi。
  2: Z-Wave。
  3: ZigBee。
  4: BLE。
  5: PLC。
  */
  protType: string;
  /**
   * 设置设备信息
   */
  setupType: string;
  /**
   * 设备的序列号，用于唯一标识该设备，可以根据MAC地址或者IMEI号等信息来设置。SN只用于对初次发现的设备进行唯一标识，一旦注册从云端分配到devId后，便通过devId来访问该设备
   */
  sn: string;
  /**
   * 软件版本
   */
  swv: string;
  udid: string;
}

export interface IDevService<S, D> {
  sid: S;
  st: string;
  reportId: string;
  data?: D;
  ts?: HuaweiTime;
}

export type Bool = "true" | "false";

export interface IDevResult<S, D> {
  /**
   * 设备控制状态 。取值说明如下：
    0：空闲。
    1：控制中。
    2：升级中。
   */
  controlStatus: number;
  /**
   * 设备ID
   */
  devId: string;
  devInfo: IDevInfo;
  /**
   * 设备名称
   */
  devName: string;
  /**
   * 设备标签
   */
  devTags: { sharable: Bool; personal: Bool; groupStatus: Bool };
  deviceAliasNames: [];
  /**
   * 区分设备的ID
   */
  deviceId: string;
  deviceaddstatus: number;
  /**
   * 设备所处Gateway的ID
   */
  gatewayId: string;
  /**
   * 分享该设备权限设备管理员的homeID
   */
  homeId: string;
  /**
   * 房间名称
   */
  homeName: string;
  installationStatus: number;
  isDeleted: boolean;
  /**
   * 是否是本地化管理的设备
   */
  isLocalDevice: boolean;
  isTitleOrNot: boolean;
  /**
   * 节点类型，取值范围如下：
    ENDPOINT：通过网关接入的设备。
    GATEWAY：网关。
    GROUP：设备组。
   */
  nodeType: string;
  /**
   * 设备的操作权限，取值范围包括：EXECUTE、WRITE,、READ
   */
  operations: ("READ" | "EXECUTE" | "WRITE")[];
  /**
   * 产品ID，该取值与devInfo中的prodId保持一致
   */
  prodId: string;
  redPointFlag: number;
  /**
   * 设备注册时间（毫秒级时间戳）
   */
  registryTime: HuaweiTimestamp;
  /**
   * 是否是自己的设备homeName
   * role: "owner";
   */
  role: string;
  roomAliasNames: string[];
  /**
   * 房间ID
   */
  roomId: number;
  /**
   * 房间名称
   */
  roomName: string;
  /**
   * 设备的服务能力信息
   */
  services: IDevService<S, D>[];
  /**
   * 设备状态。取值说明如下：
    offline：设备离线。
    online：设备在线。
    inbox：未注册设备。
    unConfigure: 海外未配置的路由
   */
  status: string;
  supportShare: boolean;
  errcode?: number;
}

export interface ICacheDevResult<S, D> extends IDevResult<S, D> {
  /**
   * 房间类型 设备家庭类型
   */
  homeType: string;
  from: string;
}
